#ifndef MERGEDEXPORTMANAGER_H
#define MERGEDEXPORTMANAGER_H

#include <QtCore/QObject>
#include <QtCore/QThread>
#include <QtCore/QThreadPool>
#include <QtCore/QMutex>
#include <QtCore/QWaitCondition>
#include <QtCore/QHash>
#include <QtCore/QList>
#include <QtCore/QTimer>
#include <QtCore/QString>
#include <QtCore/QAtomicInt>
#include <QtGui/QImage>
#include "processingsettings.h"
#include "unifiedfileinfo.h"  // For FileInfo definition
class UnifiedPageRenderer;
class SingleFileExportTask;

/**
 * 导出任务状态
 */
enum class ExportTaskStatus {
    Pending,
    Processing,
    Completed,
    Failed
};

/**
 * 单个文件的导出结果
 */
struct FileExportResult {
    QString filePath;
    QString tempPdfPath;
    int startPageNumber;
    int pageCount;
    ExportTaskStatus status;
    QString errorMessage;

    FileExportResult() : startPageNumber(1), pageCount(0), status(ExportTaskStatus::Pending) {}
};

/**
 * 全局导出状态枚举（状态驱动设计）
 */
enum class GlobalExportState {
    Idle,           // 空闲状态：可以开始导出
    CollectingPages,// 收集页面中：显示进度条，按钮变为取消
    Exporting,      // 导出中：显示取消按钮
    Cancelling,     // 取消中：显示"正在取消..."，禁用操作
    Cleaning        // 清理中：等待线程完全退出，禁用操作
};

// ✅ 清理：移除废弃的三阶段进度系统
// 当前导出流程：MainWindow收集页面 → MergedExportManager直接导出
// 不再需要分阶段进度计算

/**
 * 并行导出管理器
 * 负责协调多个文件的并行PDF导出，并最终合并为单个PDF
 */
class MergedExportManager : public QObject
{
    Q_OBJECT

public:
    explicit MergedExportManager(QObject *parent = nullptr);
    ~MergedExportManager();

    // 设置统一渲染器
    void setUnifiedRenderer(UnifiedPageRenderer* renderer);

    // 导出模式
    enum ExportMode {
        SinglePDF,      // 整合导出为单个PDF
        MultiplePDFs    // 导出为多个PDF
    };

    // 开始导出
    void startExport(const QList<UnifiedFileInfo>& files,
                     const ProcessingSettings& settings,
                     const QString& outputPath,
                     ExportMode mode = SinglePDF);

    // 新增：直接从页面图像导出
    void startExportFromPages(const QList<QImage>& pages,
                             const ProcessingSettings& settings,
                             const QString& outputPath);

    // 导出状态（统一使用全局状态，移除实例状态冗余）
    bool isExporting() const { return getGlobalExportState() != GlobalExportState::Idle; }

    // 获取导出进度
    int getCompletedFileCount() const;
    int getTotalFileCount() const { return m_totalFiles; }

    // ✅ 清理：移除废弃的页面收集进度方法（收集在MainWindow中完成）

signals:
    // 导出开始
    void exportStarted(int fileCount, const QString& outputPath);

    // 总体进度更新（已完成文件数，总文件数）
    void progressUpdated(int completedFiles, int totalFiles, const QString& currentFile);

    // ✅ 清理：移除detailedProgressUpdated信号（不再使用三阶段进度）

    // 单文件进度更新
    void fileProgressUpdated(const QString& fileName, int progress, ExportTaskStatus status);

    // 导出完成
    void exportCompleted(const QString& outputPath);
    void exportFailed(const QString& error);
    void exportCancelled();

    // 页面预览（用于实时显示）
    void currentPagePreview(const QImage& page, const QString& info);

    // ✅ 修复：移除threadExited信号（不再需要，改用单一定时器）

    // 状态变化信号（用于UI更新）
    void globalStateChanged(int newState);
    void exportProgressUpdated(int completed, int total, const QString& status);
    void exportErrorOccurred(const QString& error);
    void exportCancelledByUser();

public slots:
    // 停止导出（修复信号连接问题）
    void stopExport();

    // ✅ 修复：移除onThreadExited槽（不再需要，改用单一定时器）

    // 状态查询方法
    static GlobalExportState getGlobalExportState();
    static bool isGloballyExporting();
    static bool canStartNewExport();
    static QString getStateDescription();

    // 状态设置方法（用于防止重复启动）
    static void setGlobalExportState(int state);

private slots:
    // 处理单文件导出完成
    void onFileExportCompleted(const QString& filePath);
    void onFileExportFailed(const QString& filePath, const QString& error);

    // 检查导出进度
    void checkExportProgress();

    // 处理异步页面导出完成
    void onAsyncPageExportCompleted();

private:
    // 核心导出流程
    void initializeExport();
    void calculatePageNumbers();
    void startParallelExport();
    void mergeCompletedFiles();
    void finalizeExport();
    void cleanupTempFiles();
    
    // KISS重构：清理导出状态（幂等性）
    void cleanupExportState();

    // PDF合并
    bool mergePDFs(const QStringList& inputPaths, const QString& outputPath);

    // Martin Fowler重构：Extract Method - 页码计算辅助方法
    int calculateGlobalPageNumber(int fileIndex, int pageIndex, const QStringList& inputPaths) const;

    // 直接将页面图像导出为PDF（旧方法，保留兼容性）
    bool exportPagesToPDF(const QList<QImage>& pages, const QString& outputPath);
    
    // KISS增强：隔离的导出方法（线程安全，数据拷贝）
    bool exportPagesToPDFIsolated(
        const QList<QImage>& pages,
        const QString& outputPath,
        const ProcessingSettings& settings,
        quint64 myToken
    );

    // 异步页面导出
    void startAsyncPageExport();

    // ✅ 清理：移除废弃的多阶段进度计算方法

    // 状态管理
    UnifiedPageRenderer* m_renderer;

    // 导出参数
    QList<UnifiedFileInfo> m_files;
    QList<QImage> m_pages;  // 新增：页面图像数据
    ProcessingSettings m_settings;
    QString m_outputPath;
    ExportMode m_exportMode;

    // 导出状态
    // m_isExporting 已移除，统一使用全局状态 s_globalExportState
    int m_totalFiles;
    int m_completedFiles;

    // 并行任务管理
    QThreadPool* m_threadPool;
    QHash<QString, FileExportResult> m_exportResults;
    mutable QMutex m_resultsMutex;

    // 页码连续性管理
    void assignPageNumbers();

    // 心跳相关方法已移除 - 使用简化的导出流程

    // 进度检查定时器
    QTimer* m_progressTimer;

    // 心跳相关机制已移除 - 使用简化的导出流程

    // 异步导出线程追踪（修复取消导出问题）
    QThread* m_exportThread;

    // 协作式取消机制（线程安全）
    QAtomicInt m_cancelRequested;
    // m_stallCount 已移除
    
    // KISS增强：导出令牌（防止旧线程干扰新导出）
    QAtomicInteger<quint64> m_exportToken;
    
    // 辅助方法
    quint64 generateToken() const;
    bool isValidToken(quint64 token) const;

    // 注意：GlobalExportState枚举已在全局作用域定义（第47行）

    // 静态全局状态管理
    static QAtomicInt s_globalExportState;  // 使用原子操作保证线程安全
    static QAtomicInt s_exportThreadId;     // 记录导出线程ID
    static QDateTime s_exportStartTime;     // 记录导出开始时间

    // 临时文件管理
    QStringList m_tempFiles;
    QString generateTempFilePath(const QString& originalPath);
};

#endif // MERGEDEXPORTMANAGER_H